<?php
/**
 * Класс DB
 *
 * Запись в базу данных и попутно в CSV-файл
 * При необходимости создается база данных и таблица в ней.
 *
 * @author Овчарик Игорь Николаевич <oiliss@bk.ru>
 * @version 0.1
 */


class DB
{
    /**
     * @staticvar resource ссылка на соединение с базой данных
     */
    private static $mysqlLink;

    /**
     * Главный метод записи данных.
     * Записывает в базу и csv-файл.
     *
     * @param array ( array( "name", "model", "price", "link") ) $list массив выбранных данных
     * @param string $query строка запроса к серверу
     * @param string $queryDate строка даты и времени запроса к серверу
     * @return
     */
    public static function save( $list, $query, $queryDate )
    {
        self::saveToCsvFile( $list );
        self::saveToDb( $list, $query, $queryDate );
    }

    /**
     * Записываем данные в csv-файл.
     *
     * @param array ( array( "name", "model", "price", "link") ) $list массив выбранных данных
     * @return
     */
    private static function saveToCsvFile( $list )
    {
        if ( ! file_exists( Common::CSV_DIR ) ) {
            mkdir( Common::CSV_DIR, 0777, true );
        }
        $fp = fopen( Common::CSV_DIR . "/" . Common::CSV_FILE_NAME, 'w' );

        foreach ( $list as $fields ) {
            fputcsv( $fp, $fields, ';' );
        }

        fclose( $fp );
    }

    /**
     * Запись в базу данных.
     * При необходимости создается база данных и таблица.
     *
     * @param array ( array( "name", "model", "price", "link") ) $list массив выбранных данных
     * @param string $query строка запроса к серверу
     * @param string $queryDate строка даты и времени запроса к серверу
     * @return
     */
    private static function saveToDb( $list, $query, $queryDate )
    {
        self::$mysqlLink = mysql_connect( Common::MYSQL_HOST, Common::MYSQL_USER, Common::MYSQL_PASSWORD );
        if ( ! self::$mysqlLink ) {
            Log::write( "Ошибка соединения: " . mysql_error() );
            die();
        }
        if ( ! self::dbExists() ) {
            self::createDb();
        }
        if ( ! self::tableExists() ) {
            self::createTable();
        }

        self::selectDb();
        if ( ! mysql_query( "INSERT INTO " . Common::MYSQL_TABLE .
            " (`query`, `data`, `query_date`)" .
            " values (" .
            "'" . $query . "', " .
            "'" . mysql_real_escape_string( print_r( $list, true ), self::$mysqlLink ) . "', " .
            "'" . $queryDate . "')", self::$mysqlLink )
        ) {
            Log::write( 'Ошибка записи в базу данных: ' . mysql_error() );
            die();
        }

        mysql_close( self::$mysqlLink );
    }

    /**
     * Существует ли наша база данных?
     *
     * @return boolean
     */
    private static function dbExists()
    {
        $dbExists = false;
        $res      = mysql_query( "SHOW DATABASES", self::$mysqlLink );
        while ( $row = mysql_fetch_assoc( $res ) ) {
            if ( $row[ "Database" ] == Common::MYSQL_DATABASE ) {
                $dbExists = true;
            }
        }
        return $dbExists;
    }

    /**
     * Создание базы данных
     *
     * @return
     */
    private static function createDb()
    {
        $sql = "CREATE DATABASE " . Common::MYSQL_DATABASE;
        if ( mysql_query( $sql, self::$mysqlLink ) ) {
            Log::write( "База " . Common::MYSQL_DATABASE . " успешно создана" );
        } else {
            Log::write( "Ошибка при создании базы данных: " . mysql_error() );
            die();
        }
    }

    /**
     * Существует ли наша таблица?
     *
     * @return boolean
     */
    private static function tableExists()
    {
        self::selectDb();
        $tableExists = false;
        $res         = mysql_query( "SHOW TABLES", self::$mysqlLink );
        while ( $row = mysql_fetch_row( $res ) ) {
            if ( $row[ 0 ] == Common::MYSQL_TABLE ) {
                $tableExists = true;
            }
        }
        return $tableExists;
    }

    /**
     * Переключение на нашу базу данных
     *
     * @return
     */
    private static function selectDb()
    {
        if ( ! mysql_select_db( Common::MYSQL_DATABASE, self::$mysqlLink ) ) {
            Log::write( 'Не удалось выбрать базу данных: ' . mysql_error() );
            die();
        }
    }

    /**
     * Создание таблицы
     *
     * @return
     */
    private static function createTable()
    {
        self::selectDb();
        $sql = "CREATE TABLE " . Common::MYSQL_TABLE . " (
                    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
                    `query` varchar(300) NOT NULL DEFAULT '',
                    `data` text,
                    `query_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
                PRIMARY KEY (`id`)
                )
                ";
        if ( mysql_query( $sql, self::$mysqlLink ) ) {
            Log::write( "Таблица " . Common::MYSQL_TABLE . " успешно создана" );
        } else {
            Log::write( 'Ошибка при создании таблицы: ' . mysql_error() );
            die();
        }
    }

}